# def send(form, to, string):
#     print(f'{form}给{to}发送了一条消息: {string}')
from time import perf_counter


# def happy_birthday(name, age):
#     print('祝'+name+'生日快乐')
#     print(str(age)+'岁生日快乐')

# 调用函数
# send("I", "You", "I love you") # true
# send("You", "I", "I love you") # true

# happy_birthday("张三", 18) # true
# happy_birthday(18, "张三") # false


# def happy_birthday(name='张三', age=18):
#     print('祝'+name+'生日快乐')
#     print(str(age)+'岁生日快乐')
#
# # 不传参数，使用默认值，给name与age赋值
# happy_birthday() # true
#
# # 传一个参数：使用位置参数
# # 当只传入一个参数时，默认是将该参数赋值给最前面的形参
# happy_birthday("李四") # true
# # happy_birthday(20) # false
#
# # 传一个参数：使用关键字传参
# # 由于关键字参数指定了固定的形参，因此不存在顺序问题了
# happy_birthday(name='李四') # true
# happy_birthday(age=20) # true
#
# # 传两个参数：使用位置参数
# # 不能颠倒顺序
# # happy_birthday(20, "李四") # false
#
# # 传两个参数：使用关键字参数
# # 同样指定了固定的形参，便不再要求顺序了
# happy_birthday(age=20, name='李四') # true
# happy_birthday(name='李四', age=20) # true


# # 普通参数
# def fun1(a, b):
#     pass
# # 默认值参数与普通参数混用
# def fun2(a=18, b): # Error，这里会有错误
#     pass
# def fun3(a, b=18):
#     pass
# # 默认值参数
# def fun4(a=18, b=20):
#     pass


# 可变参数：个数可变的位置参数
# def fun(*args):
#     # args是一个元组
#     print(type(args))
#     for i in args:
#         print(i,end='\t')
#     print()
#
# fun(1,2,3,4,5)
# fun('张三')
# fun(['张三', 18, 180]) # 这是传了一个列表，作为一个位置参数
# # 若想要序列将其中的元素作为参数传递，需要用到解包操作：*
# fun(*['张三', 18, 180])

# 可变参数：个数可变的关键字参数
# def fun(**kwargs):
#     # kwargs是一个字典
#     print(type(kwargs))
#     for key, value in kwargs.items():
#         print(key, value, end='\t')
#     print()

# lst = ['张三', '李四', '王五']
# fun(kwargs=lst)
# fun(**lst)

# fun(name='张三', age='18')
# fun(name='李四')
# d = {'张三':18, '李四':20, '王五':25}
# # 一定要是关键字参数
# # 下面这种写法，key为kwargs, value为d
# fun(kwargs=d)
# # 还可以解包操作：**
# fun(**d) # 这就是把字典中的元素传了过去